from django.http import JsonResponse  # 导入JsonResponse用于返回JSON格式的HTTP响应
from django.views import View  # 导入View基类用于创建视图
from django.contrib.auth import authenticate, logout  # 导入authenticate用于用户认证
from django.contrib.auth import login as auth_login  # 导入login并重命名为auth_login用于用户登录
from django.views.decorators.csrf import csrf_exempt  # 导入csrf_exempt用于禁用CSRF保护
from django.utils.decorators import method_decorator  # 导入method_decorator用于装饰类方法
from .models import CustomUser, Profile  # 导入自定义用户模型CustomUser和Profile
from django.contrib.auth.hashers import make_password  # 导入make_password用于密码加密
from django.core.files.base import ContentFile  # 导入ContentFile用于处理文件
from django.core.files.storage import default_storage  # 导入default_storage用于文件存储
import json  # 导入json模块用于解析JSON数据

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class RegisterView(View):  # 定义用户注册视图类
    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        email = data.get('email')  # 获取email字段
        username = data.get('username')  # 获取username字段
        password = data.get('password')  # 获取password字段

        if not email or not username or not password:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        if CustomUser.objects.filter(email=email).exists():  # 检查邮箱是否已存在
            return JsonResponse({'message': '邮箱已存在', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        user = CustomUser.objects.create(  # 创建新用户
            email=email,
            username=username,
            password=make_password(password),  # 对密码进行加密
            is_admin=False  # 设置为非管理员
        )
        print(user)
        Profile.objects.create(
                user=user,
                phone=None,
                user_type="school"
        )   
        return JsonResponse({'message': '用户注册成功', 'data': None, 'code': 201}, status=200)  # 返回成功信息

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class LoginView(View):  # 定义用户登录视图类
    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        email = data.get('email')  # 获取email字段
        password = data.get('password')  # 获取password字段

        if not email or not password:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        user = authenticate(email=email, password=password)  # 验证用户凭据
        if user is not None:  # 如果用户存在
            auth_login(request, user)  # 执行用户登录
            user_profile = {
                'email': user.email,
                'username': user.username,
                'user_id': user.id,
                'is_admin': user.is_admin
            }
            response = JsonResponse({'message': '登录成功', 'data': user_profile, 'code': 200}, status=200)  # 返回成功信息
            # 保存用户详情

        
            return response
        else:
            return JsonResponse({'message': '凭据无效', 'data': None, 'code': 400}, status=200)  # 返回错误信息

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class LogoutView(View):  # 定义用户退出登录视图类
    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        logout(request)  # 执行用户退出登录
        return JsonResponse({'message': '退出登录成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
class ProfileView(View):  # 定义用户资料视图类
    def get(self, request, *args, **kwargs):  # 定义处理GET请求的方法
        user_id = request.GET.get('user_id', None)  # 获取user_id字段，如果不存在则返回None
        print(user_id)
        if not user_id:  # 检查user_id是否存在
            return JsonResponse({'message': '需要用户ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息
        try:
            profile = Profile.objects.get(user_id=user_id)  # 获取用户资料
            profile_data = {
                'email': profile.user.email,
                'username': profile.user.username,
                'phone': profile.phone,
                'is_verified': profile.is_verified,
                'register_time': profile.register_time,
                'last_login_ip': profile.last_login_ip,
                'user_type': profile.user_type,
                'avatar': profile.avatar.url if profile.avatar else None
            }
            return JsonResponse({'message': '用户资料获取成功', 'data': profile_data, 'code': 200}, status=200)  # 返回用户资料
        except Profile.DoesNotExist:
            return JsonResponse({'message': '用户资料未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        user_id = request.session.get('user_id')  # 从session中获取user_id字段
        phone = data.get('phone')  # 获取phone字段
        user_type = data.get('user_type')  # 获取user_type字段

        if not user_id or not phone or not user_type:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            user = CustomUser.objects.get(id=user_id)  # 获取用户
            profile = Profile.objects.create(  # 创建用户资料
                user=user,
                phone=phone,
                user_type=user_type
            )
            return JsonResponse({'message': '用户资料创建成功', 'data': {'profile_id': profile.id}, 'code': 201}, status=200)  # 返回成功信息
        except CustomUser.DoesNotExist:
            return JsonResponse({'message': '用户未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

    def put(self, request, *args, **kwargs):  # 定义处理PUT请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        user_id = data.get('user_id')  # 获取user_id字段
        phone = data.get('phone')  # 获取phone字段
        user_type = data.get('user_type')  # 获取user_type字段

        if not user_id:  # 检查user_id是否存在
            return JsonResponse({'message': '需要用户ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            profile = Profile.objects.get(user_id=user_id)  # 获取用户资料
            if phone:
                profile.phone = phone  # 更新phone字段
            if user_type:
                profile.user_type = user_type  # 更新user_type字段
            profile.save()  # 保存更改
            return JsonResponse({'message': '用户资料更新成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
        except Profile.DoesNotExist:
            return JsonResponse({'message': '用户资料未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

    def delete(self, request, *args, **kwargs):  # 定义处理DELETE请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        user_id = data.get('user_id')  # 获取user_id字段
        if not user_id:  # 检查user_id是否存在
            return JsonResponse({'message': '需要用户ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            profile = Profile.objects.get(user_id=user_id)  # 获取用户资料
            profile.delete()  # 删除用户资料
            return JsonResponse({'message': '用户资料删除成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
        except Profile.DoesNotExist:
            return JsonResponse({'message': '用户资料未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class AvatarUploadView(View):  # 定义头像上传视图类
    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        user_id = request.session.get('user_id')  # 从session中获取user_id字段
        avatar = request.FILES.get('avatar')  # 获取avatar文件

        if not user_id or not avatar:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            profile = Profile.objects.get(user_id=user_id)  # 获取用户资料
            file_name = default_storage.save(f'avatars/{user_id}_{avatar.name}', ContentFile(avatar.read()))  # 保存头像文件
            profile.avatar = file_name  # 更新头像字段
            profile.save()  # 保存更改
            return JsonResponse({'message': '头像上传成功', 'data': {'avatar_url': profile.avatar.url}, 'code': 200}, status=200)  # 返回成功信息
        except Profile.DoesNotExist:
            return JsonResponse({'message': '用户资料未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息
